package estacion.acciones;


import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import Fabricas.FabricaAdministrador;
import Fabricas.FabricaClientes;
import Fabricas.FabricaConductor;
import Fabricas.FabricaPersona;
import Fabricas.FabricaRevisor;
import Fabricas.FabricaVendedor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import estacion.dominio.Autobus;
import estacion.dominio.Cliente;

import estacion.dominio.Conductor;
import estacion.dominio.Estacion;
import estacion.dominio.Linea;
import estacion.dominio.Persona;
import estacion.dominio.Producto;
import estacion.dominio.Revisor;
import estacion.dominio.Taxi;
import estacion.dominio.Tienda;
import estacion.dominio.Trabajador;
import estacion.dominio.Tramo;
import estacion.dominio.Tren;
import estacion.dominio.Vehiculo;
import estacion.dominio.Vendedor;

public class Login extends ActionSupport {

	private static final long serialVersionUID = 1L;
	private static final String VENDEDOR = "vendedor";
	private static final String ADMINISTRADOR = "administrador";
	private static final String CONDUCTOR = "conductor";
	private static final String REVISOR = "revisor";
	private static final String CLIENTE = "cliente";
	String j_username, j_password, j_rol;
	private Persona persona;
	
	/////
	private Producto p=new Producto();
	private Estacion e=new Estacion();
	////
	private ArrayList<String> lic;
	private ArrayList<String> veh;
	private ArrayList<String> tie;
	private ArrayList<String> lin;
    
    @Override
    public String execute() throws Exception {
    	
    	FabricaPersona f;

    	
    	//Class person=Class.forName("estacion.dominio");
    	//Persona p=(Persona) person.newInstance();
    	
    	//p=p.consultarPersona(this.getJ_username());
    	
    	
    	
    	if (this.getJ_rol().equals("Cliente")) {
    		f=new FabricaClientes();
    	} else if (this.getJ_rol().equals("Vendedor")){
    		f=new FabricaVendedor();
    	}else if (this.getJ_rol().equals("Revisor")){
    		f=new FabricaRevisor();
    	}else if (this.getJ_rol().equals("Conductor")){
    		f=new FabricaConductor();
    	}else f=new FabricaAdministrador();
    	
    	
    	this.persona=f.buildPersona(getJ_username(), getJ_password());
    	ActionContext.getContext().getSession().put("persona", this.persona);    	
     	if (persona!=null&&persona.getRol().equals(this.getJ_rol())) {
    		if(getJ_rol().equals("Vendedor")){ return VENDEDOR;}
    		else if(getJ_rol().equals("Administrador")) return ADMINISTRADOR;
    		else if(getJ_rol().equals("Conductor"))return CONDUCTOR;
    		else if(getJ_rol().equals("Revisor")) return REVISOR;
    		else if(getJ_rol().equals("Cliente")) return CLIENTE;
    		else return ERROR;
        }
     	else {
            this.addActionError("Error..!");
            return ERROR;
        }
    }
    
    public String getJ_password() {
        return j_password;
    }

    public void setPassword(String j_password) {
        this.j_password = j_password;
    }

    public String getJ_username() {
        return j_username;
    }

    public void setUsername(String j_username) {
        this.j_username = j_username;
    }
    
    public String getJ_rol() {
        return j_rol;
    }

    public void setRol(String j_rol) {
        this.j_rol = j_rol;
    }

   public Persona getPersona(){
	   return persona;
    }
    
    public Tienda getTienda() throws Exception{
    	Tienda tien=new Tienda();
    	tien=tien.consultTiendaporCodigo(((Vendedor) persona).gettienda().getCodigo_Tienda());
		return tien;	
    }
    
        
    public Vehiculo getVehiculo() throws Exception{
		Taxi taxi=new Taxi();
		Autobus bus=new Autobus();
		Tren tren=new Tren();
		taxi=(Taxi) taxi.consultarVehiculo(((Conductor) persona).getTipo_vehiculo());
		bus=(Autobus) bus.consultarVehiculo(((Conductor) persona).getTipo_vehiculo());
		tren=(Tren) tren.consultarVehiculo(((Conductor) persona).getTipo_vehiculo());
		if(taxi!=null) return taxi;
		else if(bus!=null)return bus;
		else return tren;
	}

    public List<Producto> getListaJuguetes() throws Exception {
		return p.getProductos(1);
	}

	public List<Producto> getListaSouvenires() throws Exception {
		return p.getProductos(2);
	}

	public List<Producto> getListaComida() throws Exception {
		return p.getProductos(3);
	}

	public List<Producto> getLista() throws Exception {
		return p.getProductos(((Vendedor)((Trabajador)this.persona)).gettienda().getCodigo_Tienda());
	}
	
	public List<String> estaciones() throws Exception {
		Estacion e = new Estacion();
		List<Estacion> aux = e.getEstaciones();
		List<String> estaciones = new ArrayList<String>();
		for(int i=0; i<aux.size();i++) estaciones.add(aux.get(i).getEstacion());
		
		return estaciones;
	}
	
	public List<Estacion> getEstaciones() throws Exception {
		return e.getEstaciones();
	}
	public List<Estacion> getEstacionesOrigen() throws Exception {
		if(this.persona.getRol().equals("Revisor")){
			Vehiculo v=new Tren();
			String tipo_vehiculo=((Revisor)((Trabajador)this.persona)).getTipo_vehiculo();
			int cod_linea=((Tren)(v.consultarVehiculo(tipo_vehiculo))).getLinea().getCodigo_linea();
			return e.getEstacionesOrigen(cod_linea);
		}else{
			Vehiculo v=new Autobus();
			String tipo_vehiculo=((Conductor)((Trabajador)this.persona)).getTipo_vehiculo();
			int cod_linea=((Autobus)(v.consultarVehiculo(tipo_vehiculo))).getLinea().getCodigo_linea();
			return e.getEstacionesOrigen(cod_linea);
		}
	}
	public List<Estacion> getEstacionesDestino() throws Exception {
		if(this.persona.getRol().equals("Revisor")){
			Vehiculo v=new Tren();
			String tipo_vehiculo=((Revisor)((Trabajador)this.persona)).getTipo_vehiculo();
			int cod_linea=((Tren)(v.consultarVehiculo(tipo_vehiculo))).getLinea().getCodigo_linea();
			return e.getEstacionesDestino(cod_linea);
		}else{
			Vehiculo v=new Autobus();
			String tipo_vehiculo=((Conductor)((Trabajador)this.persona)).getTipo_vehiculo();
			int cod_linea=((Autobus)(v.consultarVehiculo(tipo_vehiculo))).getLinea().getCodigo_linea();
			return e.getEstacionesDestino(cod_linea);
		}
	}
    
	
	public ArrayList<String> li(){
		lic = new ArrayList<String>();
		lic.add("--");
		lic.add("tren");
		lic.add("taxi");
		lic.add("bus");
		return lic;
	}
	
	public ArrayList<String> nombres_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) nombres.add(lineas.get(i).getnombre());
		
		return nombres;
	}
	
	public ArrayList<String> nombres_lineas_sin() throws Exception{
		Linea lin = new Linea();
		Tren t = new Tren();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++){
			if(t.consultarVehiculoLinea(lineas.get(i).getCodigo_linea()) == null){
				nombres.add(lineas.get(i).getnombre());
			}
		}
		
		return nombres;
	}
	
	public ArrayList<Integer> codigos_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<Integer> codigos = new ArrayList<Integer>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) codigos.add(lineas.get(i).getCodigo_linea());
		
		return codigos;
	}
	
	public ArrayList<String> vehiculos() throws Exception{
		Taxi taxi=new Taxi();
		Autobus autobus=new Autobus();
		Tren tren=new Tren();
		Conductor cond=new Conductor();
		List<Persona> conds=cond.getPersonas();
		Revisor rev=new Revisor();
		List<Persona> revs=rev.getPersonas();
		List<Vehiculo> taxis=taxi.getVehiculos();
		List<Vehiculo> trenes=tren.getVehiculos();
		List<Vehiculo> autobuses=autobus.getVehiculos();
		veh = new ArrayList<String>();
		veh.add("--");
		for(int i=0;i<taxis.size();i++)	veh.add(taxis.get(i).getCodigo_vehiculo());
		for(int i=0;i<trenes.size();i++)veh.add(trenes.get(i).getCodigo_vehiculo());
		for(int i=0;i<autobuses.size();i++)veh.add(autobuses.get(i).getCodigo_vehiculo());
		for(int i=0;i<conds.size();i++){
			for(int j=0;j<veh.size();j++){
				if(veh.get(j).equals((((Conductor) conds.get(i)).getTipo_vehiculo()))&&!((Conductor) conds.get(i)).getLicencia().getTipo_licencia().equals("tren")){
					veh.remove(j);
				}
			}
		}
	   for(int i=0;i<conds.size();i++){
		   for(int k=0;k<revs.size();k++){
			for(int j=0;j<veh.size();j++){
				if(veh.get(j).equals((((Conductor) conds.get(i)).getTipo_vehiculo()))&&veh.get(j).equals((((Revisor) revs.get(k)).getTipo_vehiculo()))){
					veh.remove(j);
				}
			}
		   }
		}
		
		return veh;
	}

	public ArrayList<String> tienda() throws Exception{
		Tienda tienda=new Tienda();
		Vendedor vend=new Vendedor();
		List<Persona> vends=vend.getPersonas();
		List<Tienda> tiendas=tienda.getTiendas();
		tie = new ArrayList<String>();
		tie.add("--");
		for(int k=0;k<tiendas.size();k++) tie.add(tiendas.get(k).getTipo_producto());
		for(int i=0;i<vends.size();i++){
			for(int j=0;j<tie.size();j++){
				if(tie.get(j).equals(tienda.consultTiendaporCodigo(((Vendedor) vends.get(i)).gettienda().getCodigo_Tienda()).getTipo_producto())){
					tie.remove(j);
				}
			}
		}
		return tie;
	}
	
	
	public ArrayList<String> linea() throws Exception{
		Linea linea=new Linea();
		Tramo t=new Tramo();
		Tren tr=new Tren();
		Autobus b=new Autobus();
		List<Vehiculo> trenes=tr.getVehiculos();
		List<Vehiculo> buses=b.getVehiculos();
		List<Linea> lineas=linea.getLineas();
		lin = new ArrayList<String>();
		lin.add("--");
		for(int i=0;i<lineas.size();i++){
			if(t.consultarTramos(lineas.get(i).getCodigo_linea())>0)lin.add(lineas.get(i).getnombre());
		}
		for(int i=0;i<trenes.size();i++){
			for(int j=0;j<lin.size();j++){
				if(lin.get(j).equals(linea.consultarLinea(((Tren)trenes.get(i)).getLinea().getCodigo_linea()).getnombre())){
					lin.remove(j);
				}
			}
		}
		for(int i=0;i<buses.size();i++){
			for(int j=0;j<lin.size();j++){
				if(lin.get(j).equals(linea.consultarLinea(((Autobus)buses.get(i)).getLinea().getCodigo_linea()).getnombre())){
					lin.remove(j);
				}
			}
		}
		return lin;
	}
	
	
	public Vendedor getVendedor(){
		   return (Vendedor) persona;
	    }
    
}